<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script>
      /*
        使用工厂方法创建的对象,使用的构造函数都是Object
          所以创建的对象都是Object
          就导致我们无法区分出多种不同类型的对象


        创建一个构造函数,专门用来创建Person对象的
          构造函数就是一个普通的函数,创建方式和普通函数没有区别
          不同的是构造函数习惯上首字母大写

        
        构造函数和普通函数的区别就是调用方式的不同
          普通函数是直接调用,构造函数需要使用new关键字来调用
          
        构造函数的执行流程:
          1.当调用构造函数的时候,会立刻创建一个新的对象
          2.将新建的对象设置为函数中this
          3.逐行执行函数中的代码
          4.将新建的对象作为返回值返回

        使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类。
          我们将通过一个构造函数创建的对象,称为是该类的实例
        
        this的情况:
          1.当以函数的形式调用时,this是window
          2.当以方法的形式调用时,谁调用方法this就是谁
          3.当以构造函数的形式调用时,this就是新创建的那个对象
       */
      function Person(name, age, gender) {
        //这里会默认作为返回值返回给person
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.sayName = function () {
          alert(this.name);
        };
      }

      function Dog() {}

      var person = new Person('孙悟空', 18, '男');

      var person2 = new Person('玉兔精', 16, '男');

      var person3 = new Person('奔波霸', 38, '男');

      var dog = new Dog();

      console.log(person);
      console.log(dog);

      /* 
        使用instanceof可以检查一个对象是否是一个类的实例
        语法:
            对象 instanceof 构造函数
          如果是,则返回true,否则返回false
      */
      console.log(person instanceof Person);
      console.log(dog instanceof Person);

      /* 
        所有的对象都是Object类的后代
          所以任何对象和Object做instanceof检查时都会返回true
      */
      console.log(person instanceof Object);
    </script>
  </head>
  <body></body>
</html>
